#ifndef _APPLICATION_H_
#define _APPLICATION_H_

// FreeRTOS相关头文件
#include <freertos/FreeRTOS.h>
#include <freertos/event_groups.h>
#include <freertos/task.h>
#include <esp_timer.h>

// C++标准库头文件
#include <string>
#include <mutex>
#include <list>

// Opus音频编解码相关头文件
#include <opus_encoder.h>
#include <opus_decoder.h>
#include <opus_resampler.h>

// 项目自定义头文件
#include "protocol.h"
#include "ota.h"
#include "background_task.h"

#if CONFIG_USE_WAKE_WORD_DETECT
#include "wake_word_detect.h"
#endif
#if CONFIG_USE_AUDIO_PROCESSOR
#include "audio_processor.h"
#endif

// 事件标志位定义
#define SCHEDULE_EVENT (1 << 0)              // 调度事件
#define AUDIO_INPUT_READY_EVENT (1 << 1)     // 音频输入就绪事件
#define AUDIO_OUTPUT_READY_EVENT (1 << 2)    // 音频输出就绪事件

// 设备状态枚举
enum DeviceState {
    kDeviceStateUnknown,         // 未知状态
    kDeviceStateStarting,        // 启动中
    kDeviceStateWifiConfiguring, // WiFi配置中
    kDeviceStateIdle,           // 空闲状态
    kDeviceStateConnecting,     // 连接中
    kDeviceStateListening,      // 监听中
    kDeviceStateSpeaking,       // 说话中
    kDeviceStateUpgrading,      // 升级中
    kDeviceStateActivating,     // 激活中
    kDeviceStateFatalError      // 致命错误
};

// Opus音频帧时长（毫秒）
#define OPUS_FRAME_DURATION_MS 60

// 应用程序主类
class Application {
public:
    // 单例模式获取实例
    static Application& GetInstance() {
        static Application instance;
        return instance;
    }
    // 删除拷贝构造函数和赋值运算符
    Application(const Application&) = delete;
    Application& operator=(const Application&) = delete;

    // 公共接口方法
    void Start();                           // 启动应用
    DeviceState GetDeviceState() const { return device_state_; }  // 获取设备状态
    bool IsVoiceDetected() const { return voice_detected_; }      // 检测是否有语音
    void Schedule(std::function<void()> callback);                // 调度任务
    void SetDeviceState(DeviceState state);                       // 设置设备状态
    void Alert(const char* status, const char* message, const char* emotion = "", const std::string_view& sound = "");  // 显示警告
    void DismissAlert();                                          // 关闭警告
    void AbortSpeaking(AbortReason reason);                       // 中止说话
    void ToggleChatState();                                       // 切换聊天状态
    void StartListening();                                        // 开始监听
    void StopListening();                                         // 停止监听
    void UpdateIotStates();                                       // 更新IoT状态
    void Reboot();                                                // 重启设备
    void WakeWordInvoke(const std::string& wake_word);           // 唤醒词触发
    void PlaySound(const std::string_view& sound);               // 播放声音
    bool CanEnterSleepMode();                                    // 是否可以进入睡眠模式

private:
    Application();    // 构造函数
    ~Application();   // 析构函数

#if CONFIG_USE_WAKE_WORD_DETECT
    WakeWordDetect wake_word_detect_;        // 唤醒词检测模块
#endif
#if CONFIG_USE_AUDIO_PROCESSOR
    AudioProcessor audio_processor_;          // 音频处理器
#endif
    Ota ota_;                                // OTA升级模块
    std::mutex mutex_;                       // 互斥锁
    std::list<std::function<void()>> main_tasks_;  // 主任务列表
    std::unique_ptr<Protocol> protocol_;     // 协议处理模块
    EventGroupHandle_t event_group_ = nullptr;      // 事件组句柄
    esp_timer_handle_t clock_timer_handle_ = nullptr;  // 时钟定时器句柄
    volatile DeviceState device_state_ = kDeviceStateUnknown;  // 当前设备状态
    ListeningMode listening_mode_ = kListeningModeAutoStop;    // 监听模式
#if CONFIG_USE_REALTIME_CHAT
    bool realtime_chat_enabled_ = true;      // 实时聊天是否启用
#else
    bool realtime_chat_enabled_ = false;
#endif
    bool aborted_ = false;                   // 是否已中止
    bool voice_detected_ = false;            // 是否检测到语音
    int clock_ticks_ = 0;                    // 时钟计数
    TaskHandle_t main_loop_task_handle_ = nullptr;      // 主循环任务句柄
    TaskHandle_t check_new_version_task_handle_ = nullptr;  // 检查新版本任务句柄

    // 音频编解码相关成员
    TaskHandle_t audio_loop_task_handle_ = nullptr;    // 音频循环任务句柄
    BackgroundTask* background_task_ = nullptr;        // 后台任务
    std::chrono::steady_clock::time_point last_output_time_;  // 上次输出时间
    std::list<std::vector<uint8_t>> audio_decode_queue_;      // 音频解码队列

    std::unique_ptr<OpusEncoderWrapper> opus_encoder_;    // Opus编码器
    std::unique_ptr<OpusDecoderWrapper> opus_decoder_;    // Opus解码器

    OpusResampler input_resampler_;          // 输入重采样器
    OpusResampler reference_resampler_;      // 参考重采样器
    OpusResampler output_resampler_;         // 输出重采样器

    // 私有方法
    void MainLoop();                         // 主循环
    void OnAudioInput();                     // 音频输入处理
    void OnAudioOutput();                    // 音频输出处理
    void ReadAudio(std::vector<int16_t>& data, int sample_rate, int samples);  // 读取音频数据
    void ResetDecoder();                     // 重置解码器
    void SetDecodeSampleRate(int sample_rate, int frame_duration);  // 设置解码采样率
    void CheckNewVersion();                  // 检查新版本
    void ShowActivationCode();               // 显示激活码
    void OnClockTimer();                     // 时钟定时器回调
    void SetListeningMode(ListeningMode mode);  // 设置监听模式
    void AudioLoop();                        // 音频循环处理
};

#endif // _APPLICATION_H_
